package com.zeropoint.demo.util;

import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.zeropoint.demo.pojo.UserPO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.Date;

/**
 * @Author: goodtimp
 * @Date: 2019/10/1 22:44
 * @description :  jwt工具类
 */
@Component
public class JwtUtil {


    private static String secret;

    private static long expire;

    @Value("${jwt.secret}")
    public  void setSecret(String secret) {
        JwtUtil.secret = secret;
    }
    @Value("${jwt.expire}")
    public  void setExpire(long expire) {
        JwtUtil.expire = expire;
    }

    public static boolean verify(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(secret);  // 解密 验证正确性
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(token);
            // 不报异常就是正确的
            return true;
        } catch (JWTDecodeException e) {
            //logger.error("JWTToken认证解密出现UnsupportedEncodingException异常:" + e.getMessage());
            throw new JWTDecodeException("JWTToken认证解密出现UnsupportedEncodingException异常:" + e.getMessage());
        }
    }

    
     /**
     * 获得Token中有效载荷部分信息
     *
     * @param token
     * @return
     */
    public static String getClaim(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            // 只能输出String类型，如果是其他类型返回null
            return jwt.getClaim("user").asString();
        } catch (JWTDecodeException e) {
            //logger.error("解密Token中的公共信息出现JWTDecodeException异常:" + e.getMessage());
            throw new JWTDecodeException("解密Token中的公共信息出现JWTDecodeException异常:" + e.getMessage());
        }
    }

    /**
     * 生成签名 ，你可以根据自己的需求添加一些不敏感信息
     *
     * @param username            帐号id

     * @return 返回加密的Token
     */
    public static String sign(String username) {
        try {
            

            // 此处过期时间是以毫秒为单位，所以乘以1000
            Date date = new Date(System.currentTimeMillis() +  expire * 1000L); //这里用到了枚举类，access token过期时间一般为几分钟，或者几小时
            Algorithm algorithm = Algorithm.HMAC256(secret);

            // 附带account帐号信息
            return JWT.create()
                    .withClaim("user",username ) // 本来这里也是用的枚举类，改成字符串容易理解
                    //.withClaim("currentTimeMillis", currentTimeMillis)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
            //logger.error("JWTToken加密出现UnsupportedEncodingException异常:" + e.getMessage());
            throw new JWTDecodeException("JWTToken加密出现UnsupportedEncodingException异常:" + e.getMessage());
        }
    }


}
